当涉及到正则表达式和/或重写引擎时,我感到绝望,所以到目前为止,我研究和尝试的东西的时间一直没有结果。
我正在尝试使用重写引擎来完成遵循以下规则的行为:
如果请求的网址...
- 。指向现有文件,例如
domain.com/existing_file.ext
- 不重写
- 。为空,或仅包含尾随斜杠,例如
domain.com/
- 重写为
index.php?var=example
- 重写为
- 。指向不是根目录的现有目录(带或不带尾部斜杠(,例如
domain.com/existing_directory
- 重写为
index.php?var=REQUESTED_DIRECTORY_PATH/example
其中REQUESTED_DIRECTORY_PATH
是domain.com
后的所有内容(最好始终没有尾部斜杠(
- 重写为
- 。不为空,但不指向现有文件或目录,例如
domain.com/no_such_file_or_directory
- 重写为
index.php?var=REQUESTED_URL
,其中REQUESTED_URL
是domain.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
.
感谢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]
感谢您的帮助。