0

我有以下代码:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
RewriteRule ^(.*)$ $1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^\.]+)/$ $1.php
RewriteRule ^([^\.]+)/([^\.]+)/$ $1.php?id=$2

我在使用绝对 URI 时遇到了问题,它解决了。现在我想将最后一行用于以下内容:

domain.com/query/ping/2/

domain.com/query/ping.php?id=2

我认为代码很好,但我仍然返回错误 404。我应该给出一些重写条件吗?我搜索了这段代码,但没有发现任何有用的东西。

4

1 回答 1

0

根据您在上一个问题中放置 htaccess 文件的位置,您可能想要这样的内容:

RewriteCond %{REQUEST_URI} ^/query/([^/]+)/([^/]+)/?
RewriteCond %{DOCUMENT_ROOT}/query/%1.php -f
RewriteRule ^ /query/%1.php?id=%2 [L]

重要的问题是您需要/query在 URI 的开头进行检查。您所拥有的^([^\.]+)/([^\.]+)/$不会与该/query部分及其后面的 2 个路径名匹配。您的正则表达式仅匹配 2 个路径名。

该行RewriteCond %{DOCUMENT_ROOT}/query/%1.php -f类似于您上面的条件,它检查请求的 PHP 文件是否实际存在,否则不会盲目重写。这种情况确保如果有人试图去:

http://domain.com/query/blahblahblahblah/blah

您的服务器不会返回 404 错误,说明/query/blahblahblahblah.php不存在。

于 2012-12-19T23:06:08.110 回答