如何在 URL 中没有 .php 扩展名的情况下执行 PHP 网页?
Posted
技术标签:
【中文标题】如何在 URL 中没有 .php 扩展名的情况下执行 PHP 网页?【英文标题】:How to execute a PHP web page without the .php extension in the URL? 【发布时间】:2011-08-01 03:18:10 【问题描述】:对不起,菜鸟问题,从我应该搜索的内容中无法理解。
我正在使用该页面创建一个网站product.php?id=777
我希望它是product/777
谢谢!
【问题讨论】:
【参考方案1】:在您的 Web 根目录中创建 .htaccess 文件并在此处输入以下内容:
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^product/([0-9]+)$ product.php?id=$1
【讨论】:
product.php 使用什么策略?id=777&storage=usa 这只会上升到 9,因为它没有量词吗? ^product/([0-9]+)$ product.php?id=$1 RewriteRule ^product/([0-9]+)/storage/(.*)$ product.php?id=$1&storage=$2 感谢您在量词上通知我,如果没有它也可以,更新答案。 如果 conf 文件中的“AllowOverride”设置为“None”,这对你不起作用。如果您有权访问 httdp.conf,则相同的命令可以进入右侧的除了使用 mod_rewrite,您还可以在 .htaccess 中使用以下内容:
DefaultType application/x-httpd-php
只需在服务器上将您的脚本命名为 product
(不带 .php 文件扩展名)。
所以你可以直接调用它,并会收到任何附加的字符串$_SERVER["PATH_INFO"]
【讨论】:
这样做有一些重大的安全隐患,尤其是在应用程序允许用户上传的情况下。如果恶意用户可以上传文件并使用 Apache 未明确指示将其视为 PHP 以外的扩展名对其进行命名,他将能够在服务器上执行 PHP 代码。 确实如此。我希望安全后果是显而易见的。但以防万一:需要在不需要的子目录中重置设置。特别是在世界可写领域。 (无论如何,OTOH 不应该在 webroot 之下。)【参考方案3】:如果您不想使用 mod_rewrite(我没有)并且其他答案似乎对您不起作用(它们对我不起作用)。然后你可以试试这是你在 Apache 2.4+ 上运行的。
更不安全的版本:使任何没有扩展名的东西都作为 PHP 文件运行(如果像我的实现一样,你只有一个文件用于整个服务器,但仍然会让你对任意执行开放,这还不错如果有人能够将文件写入该目录...再说一次,如果他们可以写入文件,他们可以给它一个 PHP 扩展名,所以不确定这是否真的扩大了您的曝光度。)
<FilesMatch "^[^.]+$">
ForceType application/x-httpd-php
</FilesMatch>
将其放入目录的 .htaccess 文件中(假设您已启用这些文件)或将其直接放入主机定义中的片段中。
如果你想让它更具体(也许更安全),你可以用更具体的东西替换正则表达式:
<FilesMatch "^MySingleFileWithNoExension$">
ForceType application/x-httpd-php
</FilesMatch>
编辑:如果您只想定位一个文件,则不需要正则表达式。改用这个
<Files "MySingleFileWithNoExension">
ForceType application/x-httpd-php
</Files>
然后重启 Apache 就可以了!
【讨论】:
【参考方案4】:这是像 CodeIgniter 和 Zend 这样的框架轻松完成的事情,但正如其他人所建议的那样,仍然可以仅使用 Apache 的mod_rewrite
来完成。基本上,使用这样的 .htaccess 将所有流量引导到一个页面:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php?_url=$1 [QSA,L]
</IfModule>
进入该页面后,您可以解析 _url
变量,它可以是您想要的任何格式,并适当地处理请求。
【讨论】:
不会 CodeIgniter/Zend/Symfony/等。无论如何都需要利用 mod_rewrite 来完成 OP 正在寻找的东西? 是的,我的意思是,如果你只是使用mod_rewrite
,你必须自己绑定所有路由,但框架默认拥有所有路由,所以你要做的就是启用mod_rewrite
.【参考方案5】:
多年来,我一直使用以下代码执行名为“Support”的文件(不是 Support.php,我不希望通过两种方式访问该文件)。
<Files Support>
SetHandler php-script
</Files>
但是,当我使用 Plesk 以 PHP 7.0 执行脚本时,我开始遇到这个问题。根目录 (.com/index.php) 可以作为 PHP 7 运行,但我的任何 php 脚本文件 (.com/Support) 都可以作为我的 Plesk 默认 PHP 5.4 版本运行。我还没有弄清楚它为什么这样做,但它确实解决了设置默认处理程序的问题。
【讨论】:
我在 Apache 2.4.18 中尝试过:<Files>
指令有效,SetHandler
无效。【参考方案6】:
对我来说,这段代码有效:
在“/etc/apache2/sites-available/default”或“httpd.conf”中
你必须(至少)在默认目录中有这些选项
...
<Directory />
...
Options FollowSymLinks
AllowOverride All
...
</Directory>
...
或在站点特定的站点目录中
...
<Directory "/var/www/my-site">
...
Options FollowSymLinks
AllowOverride All
...
</Directory>
...
并创建(它可能不存在,确保它可以被 apache 读取)或编辑站点目录中的“.htaccess”(例如“/var/www/my- site/.htaccess") 并添加此代码:
AddType application/x-httpd-php htm html php
AddHandler application/x-httpd-php .htm .html
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
【讨论】:
如果 uri 是 /hello.world,这个包罗万象将失败以上是关于如何在 URL 中没有 .php 扩展名的情况下执行 PHP 网页?的主要内容,如果未能解决你的问题,请参考以下文章
如何优化 sql 查询以避免在没有 php.ini 或设置时间限制的情况下执行最长时间 [关闭]
使用 PHP 从 URL 字符串中获取文件路径/扩展名 [重复]