RewriteRule for 404不起作用

时间:2016-05-21 11:23:06

标签: apache .htaccess mod-rewrite

我的.htaccess中有以下代码:

RewriteEngine on

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteRule ^admin/.+ /admin/admin_panel.php [R=404,L,NC]

第一部分应该以{{1​​}}到http://example.com/url的形式重写请求,并且它可以正常工作。第二部分应该将请求重定向到http://example.com/url.php中不存在的文件到/admin/,但这次它不起作用。我做错了吗?

2 个答案:

答案 0 :(得分:2)

通过以下代码更改第二部分:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin/admin_panel\.php
RewriteRule ^admin/(.*)$ admin/admin_panel.php [L,NC]

此标记[R=404,L,NC]将显示404状态,不会重定向到admin_panel.php

答案 1 :(得分:0)

根据this document

  

可以使用语法[R = 305]指定任何有效的HTTP响应状态代码,如果没有指定,则默认使用302状态代码。指定的状态代码不一定是重定向(3xx)状态代码。但是,如果状态代码超出重定向范围(300-399),则替换字符串将完全删除,并且重写将停止,就像使用了L一样。

使用[R=404]会删除重定向字符串,并且规则无法按照人们希望的方式工作。解决方案是使用[R=3xx]使重定向工作,或使用[R=404]而不使用重定向。另一种方法是使用ErrorDocument 404 somefile.php语法。在此示例中,解决方案是创建两个不同的文件:

/ htaccess的

RewriteEngine on

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

/admin/.htaccess

ErrorDocument 404 /admin/admin_panel.php

此外,在此解决方案中,根目录.htaccess文件中的规则按预期工作。

编辑:

请注意,下面的Mohammed Elhag's answer也可以在这里工作