[英]Apache2 .htaccess rewrite rule for nested URLs doesn't work
我有一个简单的 php 应用程序,它具有基于domain/foo/bar
嵌套 url 的导航。
例如,我有主页index.php
和about
nav 链接,它应该导航到domain/en/about
,其中en
和about
必须转移到 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.