我正在尝试整理一些htaccess代码,将 example.com/filename.php 转换为 example.com/filename / (并强制斜杠) - 我尝试了各种各样的方法,但是每个方法都没有用,从子文件夹上的500个错误到尾部斜杠的问题等等......
请帮忙!
答案 0 :(得分:13)
试试这个:
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
RewriteRule (.*)/$ $1.php [L]
第一条规则将 /foo/bar
.php
的请求从外部重定向到 /foo/bar
/
。第二条规则将 /foo/bar
/
的请求内部重写为 /foo/bar
.php
。
要强制使用尾随斜杠,请尝试以下规则:
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]
答案 1 :(得分:6)
这个Gumbo解决方案非常适合文件,但它不适用于目录。 换句话说:
对于mysite.com/file1.php
,它会显示mysite.com/file1/
,这很棒。
然而,它对目录不起作用。如果我尝试访问以下目录(其中包含index.php文件)mysite.com/dir1
,而不是显示http:/mysite.com/dir1/index.php
和url:mysite.com/dir1/
的内容,则返回404。 / p>
我的解决方案是:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ $1.php [L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]
换句话说,如果是目录,不要做任何事情。
希望它有所帮助。
原始解决方案的另一个问题是,在我将路径更改为css文件并将图像更改为绝对路径之前,不会加载css和图像。
有没有其他方法可以解决它,而不是将网站中所有文件中的所有路径更改为绝对路径。
非常感谢。
答案 2 :(得分:2)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]
像魅力一样工作 - 感谢帮助人员。
答案 3 :(得分:0)
您可以尝试解决问题here。虽然问题的解决方案不相关(但是......),问题本身提供了一组重写规则,您可以在自己的网站中使用这些规则。
如果您需要URL中的符号,您可以使用“。*”而不是特定的A-Za-z0-9,但如果您正在寻找可能的尾部斜杠,则可能需要使用“。*?”代替。这是一个标准的正则表达式功能,以避免“。*”的贪婪。
答案 4 :(得分:0)
对于路径,您可以将<base href="yourpath" />
添加到您的php页面。
答案 5 :(得分:0)
试试这个,这个可以在我的Apache上工作,即使你删除手册上的最后一个斜杠:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]