如何用mod_rewrite做这个复杂的事情?

时间:2017-08-22 21:18:09

标签: regex string apache .htaccess web-services

当谈到正则表达式和/或RewriteEngine时,我毫无希望,所以到目前为止,我研究和尝试事情的时间都相当无效。

我尝试使用RewriteEngine来完成遵循这些规则的行为:

如果请求的网址...

  • ...指向现有文件,例如 domain.com/existing_file.ext
    • 不要重写
  • ...为空,或仅包含尾部斜杠,例如 domain.com/
    • 重写为index.php?var=example
  • ...指向非root的现有目录(带或不带尾部斜杠)例如 domain.com/existing_directory
    • 重写为index.php?var=REQUESTED_DIRECTORY_PATH/example,其中REQUESTED_DIRECTORY_PATHdomain.com之后的所有内容(最好始终没有斜杠)
  • ...不是空的,但不指向现有的文件或目录,例如 domain.com/no_such_file_or_directory
    • 重写为index.php?var=REQUESTED_URL,其中REQUESTED_URLdomain.com之后的所有内容

这是我到目前为止所得到的:

# /
RewriteRule ^$ index.php?var=example [QSA,L]

# /directory_name/
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ /index.php?var=$0/example [QSA,L]

# /not_a_valid_file_or_dir/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?var=$0 [QSA,L]

对我而言似乎几乎可以做我想要的,除了当我尝试访问domain.com/existing_directory时(带或不带斜杠)。在这种情况下,我被重定向到domain.com/existing_directory/(带斜杠),而我希望最终到达domain.com/index.php?var=existing_directory/example

1 个答案:

答案 0 :(得分:1)

感谢Bananaapple提供的有用评论,以及一些谷歌搜索,我设法完成了我想要的。

首先,我必须转为DirectorySlash off,其次我需要从正则表达式中删除[^/]。所以最终的相关代码看起来像这样:

DirectorySlash Off

# /
RewriteRule ^$ index.php?var=example [QSA,L]

# /directory_name/
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ /index.php?var=$0/example [QSA,L]

# /not_a_valid_file_or_dir/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?var=$0 [QSA,L]

感谢您的帮助。