如何在 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,则相同的命令可以进入右侧的 部分。【参考方案2】:

除了使用 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 中尝试过:&lt;Files&gt; 指令有效,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 网页?的主要内容,如果未能解决你的问题,请参考以下文章

如何屏蔽 URL 中的扩展名

如何在运行时在php中重写URL

如何优化 sql 查询以避免在没有 php.ini 或设置时间限制的情况下执行最长时间 [关闭]

使用 PHP 从 URL 字符串中获取文件路径/扩展名 [重复]

如何从主页中删除 index.php 并从其他 php 文件中删除 .php 扩展名

一些没有.php扩展名的页面Mod_rewrite