1

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

我的网站有很多.php以不同文件夹深度结尾的网址。我希望所有的网址都不管子site.net/folder/folder/filename/文件夹的数量。

我的问题是我的一些表单使用 POST 和 GET 请求。因此,当用户单击上传以上传文件时,我通常将表单的操作部分设置为.php文件,例如,site.net/folder/script/upload.php或者通常在重定向到页面site.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/。同样在这一点上找不到各种脚本。

4

2 回答 2

0

我希望这段代码对你有帮助。您必须在 .htaccess 文件中编写此代码。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
于 2012-10-17T13:29:59.803 回答
0

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

然后你需要使用这个:

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

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

至于你的其他规则:

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

这可能会导致问题,因为 mod_dir完全相反,您最终可能会出现重定向循环。请注意,由于存在严重的信息泄露安全问题,mod_dir 包含尾部斜杠。. 因此,如果您想使用上述规则,请包括:

DirectorySlash Off

关闭 mod_dir 将浏览器重定向到带有斜杠的 URL 。至于最后一点,您再次遇到了尝试将 aRewriteCond应用于多个RewriteRule's 的问题。这两个条件都只适用于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]
于 2012-10-17T18:55:02.343 回答