0

好吧,我正在尝试清理我的网址......但失败得很惨:我想要一个看起来像mysite.com/front_door/some_url_here. 但我不断收到 500 错误。下面是我的 .HTACCESS,我确定这是我做错了什么,因为这只是我第三次或第四次使用 HTACCESS。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*[^/]) $1.php [L]
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{QUERY_STRING} ^pid=(([0-9a-zA-Z\-]+))$
RewriteRule ^(.*)$ http://localhost/page/%1.php [R=302,L]
4

1 回答 1

0

这就是导致您的 500 服务器错误的原因:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*[^/]) $1.php [L]

由于您的正则表达式与请求的开头或结尾不匹配,因此它可以从字面上匹配任何内容。这意味着如果你去

http://mysite.com/index.php?pid=1234

然后被重定向到

http://localhost/page/1234.php?pid=1234

该请求/page/1234.php通过 regex: 匹配第一条规则,(.*[^/])并被重写为/page/1234.php.php. 然后重写引擎循环,同样的事情再次发生,第一个规则匹配,然后重写为:/page/1234.php.php.php并继续运行,直到出现 500 错误。

不确定您要使用该规则做什么,但猜测是您希望能够请求/file并获得服务/file.php。你的规则需要是这样的:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*[^/])$ $1.php [L]

此外,您的查询字符串将继续在您的第二条规则重定向的末尾,因为您需要?在目标的末尾:

RewriteRule ^(.*)$ http://localhost/page/%1.php? [R=302,L]

没有它?,查询字符串会自动附加到末尾。

于 2013-09-30T01:48:05.017 回答