mod_rewrite和漂亮的网址

时间:2010-04-05 01:05:28

标签: apache mod-rewrite friendly-url

我想要实现的目标:

1)http://localhost/en/script.php?param1=random映射到http://localhost/script.php?param1=random&language=English

  • 这必须始终有效。

2)http://localhost/en/random/text/here将映射到http://localhost/categories.php?term=random/text/here

  • 如果random / text / here为404
  • ,则必须使用此功能

我现在所拥有的:

RewriteEngine on
RewriteCond substr(%{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^en/(.+)$ categories.php?lang=English&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ee/(.+)$ categories.php?lang=Estonian&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^fi/(.+)$ categories.php?lang=Finnish&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ru/(.+)$ categories.php?lang=Russian&terms=$1 [L]

RewriteRule ^en/(.*) $1?lang=English [QSA]
RewriteRule ^ee/(.*) $1?lang=Estonian [QSA]
RewriteRule ^ru/(.*) $1?lang=Russian [QSA]
RewriteRule ^fi/(.*) $1?lang=Finnish [QSA]

问题是什么:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 

它应该重定向到categories.php?lang =英文IF / en / this / here / does / not / match / a / script。如果我加载像en / index.php这样的URL,它也会映射到categories.php?lang = English,因为en / index.php不存在。

我的想法:

substr(%{REQUEST_FILENAME},3)将解决我的问题(因为目前/ee/index.php实际上映射到/ee/index.php而不仅仅是/index.php)

不幸的是我找不到操纵字符串的方法:/

3 个答案:

答案 0 :(得分:1)

我认为语言代码是使URL映射到不存在的文件的原因。切换这两个步骤,首先将语言代码移动到查询字符串。这还具有将关键字步骤简化为单个RewriteRule的额外优势,因为它们不再需要同时执行两项操作。

RewriteRule ^en/(.*) $1?lang=English [QSA,DPI]
RewriteRule ^ee/(.*) $1?lang=Estonian [QSA,DPI]
RewriteRule ^ru/(.*) $1?lang=Russian [QSA,DPI]
RewriteRule ^fi/(.*) $1?lang=Finnish [QSA,DPI]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ categories.php?terms=$1 [L,QSA]

答案 1 :(得分:0)

对于substr问题,您可以尝试absolute paths

RewriteRule ^en/(.*) /$1?lang=English&%{QUERY_STRING}

RewriteRule ^en/(.*) http:/localhost/$1?lang=English&%{QUERY_STRING}

另外,我可能会挑剔,但如果你在PHP基础上使用语言代码,404'不存在的语言并使用

进行语言评估,那会不会更容易
RewriteRule ^(.*?)/(.*) $2?lang=$1&%{QUERY_STRING}

编辑:取决于您拥有的脚本数量,您不能执行以下操作:

RewriteRule ^(。*?)/(script.php | other.php)$ 2?lang = $ 1 [QSA]

=有管道列表文件,可以访问吗?

答案 2 :(得分:0)

问题是您使用的是L标志。这意味着该规则将是最后执行的规则。

%{QUERY_STRING}

不是必需的,添加QSA,您将获得添加到网址末尾的所有参数

尝试做:

RewriteRule ^en/(.*) $1?lang=English [QSA]