你好,我找到了许多有关 mod-rewrite 和 Apache 的资源,但是我却无法成功制作出一个可行的示例。
下面的例子适用于
✓ 作品example.com/en/page1.php☞example.com/page1.php?ln=en(内部重定向)
✓ 作品example.com/page1.php☞example.com/en/page1.php(重定向)
✓ 作品example.com/en/☞example.com/index.php?ln=en(内部重定向)
✓ 作品example.com/☞example.com/en/(重定向)
✓ 作品example.com/blahblah☞example.com/en/error.php(重定向)
✓ 作品example.com/en/blahblah☞example.com/en/error.php(重定向)
✖ 失败example.com/de☞example.com/en/error.php(重定向 -应该是 example.com/de/)
✖ 失败example.com/de/blahblah☞example.com/en/error.php(重定向 -应该是 example.com/de/error.php)
<IfModule mod_rewrite.c>
RewriteEngine On
DirectorySlash On
# Force hostname without www REDIRECT
RewriteCond %{HTTP_HOST} !^example\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*)$ http://%1/$1 [R=301]
# /xx/somepage.php -> /somepage.php?ln=xx INTERNAL REWRITE
RewriteCond %{REQUEST_URI} ^/../.+ [NC]
RewriteRule ^(en|de)/(.*) $2?ln=$1&%{QUERY_STRING} [L]
# /en -> /en/ REDIRECT
RewriteCond %{REQUEST_URI} ^/..$ [NC]
RewriteRule ^(.*)$ $1/ [R=302,L]
# /somepage.php -> /en/somepage.php REDIRECT
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteRule ^(.*)$ /en%{REQUEST_URI} [R=302,L]
# /en/ -> /en/index.php INTERNAL REWRITE
RewriteCond %{REQUEST_URI} !^/../.+ [NC]
RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteRule ^(.*)$ /$1index.php [L]
</IfModule>
★ 注1:R=302
用于调试。在服务器上它实际上是R=301
。
★ 注2:它在Apache 2.2上,因此位%{ENV:REDIRECT_STATUS} !=200
试图模拟[END]
后来的Apache 3.2.9的标志。
谢谢!
★ 编辑:以下是更多 .conf 文件
<Directory /var/www/vhosts/example.com/httpdocs>
Options +FollowSymLinks -Indexes
AllowOverride All
AddDefaultCharset utf-8
ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 402 /error.php
...
ErrorDocument 500 /error.php
[above code here]
</Directory>
答案1
RewriteCond
如果您可以指定匹配,则无需指定RewriteRule
。例如:
# /xx/somepage.php -> /somepage.php?ln=xx INTERNAL REWRITE
RewriteCond %{REQUEST_URI} ^/../.+ [NC]
RewriteRule ^(en|de)/(.*) $2?ln=$1&%{QUERY_STRING} [L]
应该只适用于:
# /xx/somepage.php -> /somepage.php?ln=xx INTERNAL REWRITE
RewriteRule ^(en|de)/(.*) $2?ln=$1&%{QUERY_STRING} [L]
浏览两个不起作用的 URL:
example.com/de
- 匹配带有
# /en -> /en/ REDIRECT
注释的重写,URI 变为/de/
- 不匹配任何其他规则。您是否期望它匹配最后两条规则?由于 ,它们不会匹配
%{ENV:REDIRECT_STATUS} != 200
。
直接访问example.com/de/
和上面的URL结果是否不一样?
example.com/de/blahblah
- 匹配带有
# /xx/somepage.php -> /somepage.php?ln=xx
注释的重写,URI 变为blahblah.php?ln=de&othergetvars
- 其他均不匹配
您能向我们展示配置虚拟目录的指令吗?