htaccess在添加斜杠时将.php添加到$ _GET变量的末尾

时间:2017-08-08 04:08:48

标签: php apache .htaccess mod-rewrite

我尝试创建一些htaccess来改变网址

  

http://localhost/website/page.php?id=_abc-123

  

http://localhost/website/page/_abc-123

它在很大程度上起作用,因为我可以访问该页面而无需查找scripts CSS 文件。但是,如果我尝试回复$_GET["id"],而不是_abc-123,我将获得_abc-123.php

这是我目前在 htaccess 文件中的内容:

Options +FollowSymLinks

# remove extensions
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

# movie page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^page/([^/]*)$ page.php?id=$1 [L]

感谢所有帮助,

感谢。

2 个答案:

答案 0 :(得分:1)

首先,如果您不确定错误的位置,可以尝试使用.htaccess的在线工具,例如htaccess.mwl.be

显然你的第一个RewriteRule转换符合,这会导致你的“错误”。

借助此工具以及有关正则表达式如何工作的一些知识,我们可以修复您的.htaccess:

Options +FollowSymLinks

# remove extensions
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC]

# movie page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^page/([^/]*)$ page.php?id=$1 [L]

我唯一改变的是从你的第一个RewriteRule删除“L”标志,因为它的RewriteCond已经满足,但是我们需要它来完成第二个RewriteRule

有关L-flag的更多信息,请查看documentation

答案 1 :(得分:1)

首先测试电影页面,并测试是否存在.php的文件:

Options +FollowSymLinks -MultiViews
RewriteEngine On

# movie page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^page/([^/]*)$ page.php?id=$1 [L]

# remove extensions
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)/?$ $1.php [L]