我的.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/
,但这次它不起作用。我做错了吗?
答案 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)
可以使用语法[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也可以在这里工作