从URL中删除php并强制尾随斜杠

时间:2012-10-17 13:21:07

标签: php mod-rewrite file-extension

我之前已经问过这个问题,并且使用了一些我不理解的代码,现在它们全都崩溃了。希望我能比以前更准确地得到我的意图。我正在尝试学习正则表达式,但我似乎无法将我学到的东西应用于mod-rewrite技术。

我的网站上有很多网址,这些网址在整个网站的不同文件夹深度以.php结尾。 无论子文件夹的数量多少,我都希望所有网址都为site.net/folder/folder/filename/

我的问题是我的一些表单使用POST和GET请求。因此,当用户点击上传以上传文件时,我通常会将表单的操作部分设置为.php文件,例如site.net/folder/script/upload.phpsite.net/folder/folder/scripts/upload.php通常会在重定向之前处理文件上传到xyz页面。

当.php网址被删除时,我也无法找到上传脚本。 mod-rewrite规则是否可以构建为在不妨碍我的'worker'脚本(upload.php,processcontactinfo.php等)的情况下获取php扩展? 修改

这是我的脚本到目前为止的样子。

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^POST\ /([^.\ ]+\.)+php(\?[^\ ]*)?\ HTTP
RewriteCond %{THE_REQUEST} ^GET\ /([^.\ ]+\.)+php(\?[^\ ]*)?\ HTTP
RewriteRule ^(.+)\.php$ http://www.site.net/$1 [R=301,L]
RewriteRule ^([^/]+/)*index/?$ http://www.site.net/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ http://www.site.net/$1 [R=301,L]
RewriteCond $1 !^([^.]+\.)+([a-z0-9]+)$ [NC]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*[^/])$ /$1.php [L]
RewriteRule (.*)/$ $1.php [L]

我尝试了不同的变体,但就像我说我不擅长阅读或创建正则表达式。因此,它最多只是一次试错。 这允许我通过site.net/folder/filename/访问文件文件,但它不会将来自site / folder / filename.php的请求更改为site.net/folder/filename/。此时还无法找到各种脚本。

2 个答案:

答案 0 :(得分:0)

我希望这段代码可以帮到你。你必须在你的.htaccess文件上写下这段代码。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

答案 1 :(得分:0)

  

我需要它将文件视为php文件,但不显示扩展名

然后你需要使用它:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUESTI} ^(GET|POST|HEAD)\ /(.+)\.php($|\?|\ )
RewriteRule ^ /%2 [L,R=301]

你的原始规则很接近,除了条件总是和在一起,所以前两个条件都不可能都是真的。此外,条件仅适用于紧随其后的RewriteRule,因此您的第二个RewriteRule会被应用每次

至于其他规则:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ http://www.site.net/$1 [R=301,L]

这可能会导致问题,因为mod_dir 完全相反,您最终可能会遇到重定向循环。请注意,由于serious information disclosure security issue.,mod_dir包含一个尾部斜杠。因此,如果您想使用上述规则,请添加:

DirectorySlash Off

关闭mod_dir,将浏览器重定向到带有斜杠的网址。至于最后一点,您再次遇到问题,即您尝试将RewriteCond应用于多个RewriteRule。这两个条件仅适用于RewriteRule ^(.*[^/])$ /$1.php [L],最后一条规则完全没有条件。但如果看起来像你想要做的那样:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /$1.php [L]

RewriteCond %{REQUEST_URI} ^/(.*)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1.php [L]