除一个文件夹外的 URL 重写

除一个文件夹外的 URL 重写

我已经问过关于重定向特定 IP 的用户的问题Apache 允许或重定向用户感谢 dmah,它运行完美。
但是我想更进一步,不仅要限制/允许特殊文件夹,还要能够添加另一条规则(如下所述:http://www.kavoir.com/2010/02/use-php-to-handle-all-incoming-url-requests-in-a-seo-friendly-manner.html
这是我的.htaccess:

RewriteEngine on
# Define the Error Document Path
ErrorDocument 404 /404.php
# Condition for the Rewriting rule: IP NOT starting with 1.2.3.4 (example)
RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4
# Condition is matched -> redirect 404 error doc
RewriteRule ^administration/(.+) [R=404,L]

#SEO modification
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule /$ /index.php [L]

如果我不添加 SEO 修改部分,它就可以工作。当我尝试进入 /administration 目录时,我得到了 404 重定向。但是如果我添加 SEO,第一条规则就不再起作用了,我的意思是 [L] 标志未被使用。
我尝试使用 S=1 而不是 L,但 SEO 确实有效,即使对于 /administration :(
我找不到一个好的页面来解释 S=X 条件,从而形成一种 if-then-else 语句,我也不明白为什么在第一条规则上使用 L 标志时它会继续解析配置文件。
更清楚一点:
我有一个文件/文件夹结构,如下所示:

/
/管理
/管理/秘密/ /
管理/index.php
/文章/文章
/测试/文章/测试
/cool.html
/index.php
/.htaccess

我想要 /index.php 处理除管理文件夹之外的所有 URL(仅当我处于正确的 IP/范围时,才会在 /administration/index.php 文件中处理)。这意味着:http://www.foo.com/article/test/cool.html 被发送到 apache,它将 URL 重写为 /index.php,然后使用一些 explode() php 函数,我得到了参数 article、test 和 cool.html。

问题...当我输入 http://www.foo.com/administration/ ...它由 /index.php 处理,即使在允许的 IP 之外!即使 RewriteRule 的 L 标志与管理文件夹有关...我测试了很多组合:

  • 对于 IP 规则,添加 S=1 而不是 L ... 没有成功
  • 在最后一个重写规则起作用之前添加 RewriteRule ^administration/$ /administration/index.php [L] 但仅适用于 /administration,如果我输入 /administration/secret ...它由 /index.php 处理:@
  • 以及大量其他东西,只给出了一个很酷的内部服务器错误

非常感谢您的帮助和想法:-)

再次感谢 dmah!!这是我运行顺畅的 .htaccess:

RewriteEngine on
# Define the Error Document Path
ErrorDocument 404 /404.php
# Condition for the Rewriting rule: IP NOT starting with 1.2.3.4 (example)
RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4
# Trying to access administration pages.
RewriteCond %{REQUEST_URI} ^/administration
# Redirect to the 404 page.
RewriteRule .+ /404.php [R=404,L]

#SEO modification
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !^/administration
RewriteRule /$ /index.php [L]

答案1

我认为问题不在于 SEO 部分。

您的第一个 RewriteRule 已损坏。语法如下:

RewriteRule 模式替换 [标志]

我认为您需要第二个 RewriteCond 来检查所请求的 URI 中是否包含“administration”。因此,如下所示:

# Condition for the Rewriting rule: IP NOT starting with 1.2.3.4 (example)
RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4
# Trying to access administration pages.
RewriteCond %{REQUEST_URI} ^administration
# Redirect to the 404 page.
RewriteRule .+ http://localhost/404_page.html [R=404,L]

相关内容