Multible RewriteRules导致内部服务器错误

时间:2015-05-20 14:16:47

标签: php apache .htaccess mod-rewrite

迫使这个工作让我变得疯狂,所以我希望你能帮忙。

我使用重写规则和.htaccess来制作我的动态网址

example.com/page.php?id=1 

看起来像这样

example.com/1
使用

RewriteRule    ^([A-Za-z0-9-]+)/?$    page.php?id=$1    [NC,L] 

,到目前为止它完美无缺 但我还想使用

隐藏网址(impressum.phpimpressum)中的文件类型
RewriteRule (.*) $1.php [L]

因此,只要我不同时使用它们,两个规则都是完全正确的。当我这样做时,看起来像这样(我的完整文件)

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.php [L]
RewriteRule ^([A-Za-z0-9-]+)/?$    page.php?id=$1    [NC,L] 

,我收到内部服务器错误。我尝试了不同的版本,例如更改位置等等,但我总是得到这个错误。

所以我的问题是:如何将两个规则放在一起工作,而URL结尾仍然隐藏,example.com/1也可以工作?

非常感谢您的回答

2 个答案:

答案 0 :(得分:2)

您可以在.htaccess文件中使用以下内容:

RewriteEngine on

# Check if the PHP file exists and route accordingly
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]

# If not, pass the request to page.php if it contains A-Za-z0-9-
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z0-9-]+)/?$    page.php?id=$1    [NC,L] 

答案 1 :(得分:2)

您需要两个单独的规则。重写条件只会应用于紧随其后的规则,并且使用php扩展规则,在将php添加到结尾之前,必须检查php文件是否存在

RewriteEngine on

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

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z0-9-]+)/?$    page.php?id=$1    [NC,L]