繁体   English   中英

Apache2 .htaccess 嵌套 URL 的重写规则不起作用

[英]Apache2 .htaccess rewrite rule for nested URLs doesn't work

我有一个简单的 php 应用程序,它具有基于domain/foo/bar嵌套 url 的导航。

例如,我有主页index.phpabout nav 链接,它应该导航到domain/en/about ,其中enabout必须转移到 url 参数,如index.php?url=...

但是当我点击about时,我进入了domain/en/about并且404 not found

我已将 apache2 虚拟域配置配置为:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    <Directory /var/www/html/domain>
         Options -Indexes +FollowSymLinks -MultiViews
         AllowOverride All
         Require all granted
     </Directory>
    DocumentRoot /var/www/domain/   
    ServerName domain.local
    ServerAlias www.domain.local
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

.htaccess文件为:

order deny,allow
RewriteEngine On
RewriteBase /
RewriteRule .* index.php?url=$0 [QSA,L]

apache2 的mod_rewrite已经启用。

不知道我错过了什么。

任何帮助表示赞赏! 先感谢您!

您需要在要捕获的内容周围加上括号。 反向引用索引以“1”开头:

RewriteRule (.*) index.php?url=$1 [L,QSA]
<Directory /var/www/html/domain>: DocumentRoot /var/www/domain/

您的<Directory>部分和DocumentRoot指令引用不同的位置,因此无论您将.htaccess文件放在哪里,它都不会按预期工作。

然而...

 RewriteRule.* index.php?url=$0 [QSA,L]

这条规则并不严格正确,因为它最终会在重写引擎第二次通过时重写自己。 如果不是QSA标志,原始的url参数值(包含最初请求的 URL 路径)将会丢失。 以上最终将/en/about的请求重写为index.php?url=index.php&url=en/about 幸运的是,您的 PHP 脚本仍将$_GET['url']读取为en/about 但是您可以检查$_SERVER['QUERY_STRING']中的完整(错误)查询字符串。

(而且,如果您只是在替换字符串前加上斜杠,即 URL 路径,您将得到一个无休止的重写循环(500 内部服务器错误)。但这也可能是由于稍后添加其他规则造成的。 )

您应该防止对index.php本身的请求被重写,您可以通过添加附加规则来实现。 例如:

RewriteRule ^index\.php$ - [L]
RewriteRule .* index.php?url=$0 [QSA,L]

但是,这仍然会重写您的 static 资产(假设您链接到内部图像、CSS 和 JS 文件?)。 因此,如果请求已经映射到 static 文件,您通常需要使用一个附加条件来防止规则被处理。

例如:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php?url=$0 [QSA,L]

CondPattern -f检查TestString是否映射到文件。 ! 前缀否定了这一点。 因此,只有当请求map 到文件时,条件才成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM